package com.alex.engine;

import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;

public class Window
{
    // Modifier    | Class | Package | Subclass | World
    // ————————————+——————+——————+—————+
    // public      |  ✔   |    ✔    |    ✔     |   ✔   |
    // ————————————+——————+——————+—————+
    // protected   |  ✔   |    ✔    |    ✔     |   ✘   |
    // ————————————+——————+——————+—————+
    // no modifier |  ✔   |    ✔    |    ✘     |   ✘   |
    // ————————————+——————+——————+—————+
    // private     |  ✔   |    ✘    |    ✘     |   ✘   |
    // Oduvek sam se dvoumio koji modifier da koristim bilo za metodu ili promenljivu samim tim sam ja licno dosta koristi protected a u redjim slucajevima private.
    // Dok sam public modifier izbegavao. Kad je ispali da je najbolje da ne koristim modifier i onda dobijem slatko mesto izmedju protecte i private metode.
    // Takodje kad trebam da koristim private modifier imam da ga korisitm.
    
    // Zasto imam private konstruktor? Zato sto kada imam static metode u klasi, ne zelim da neko moze da napravi objekte te klase.
    // A zasto ja ne zelim da neko napravi objekte? Zato sto static metode pripadaju klasi(u ovom slucaju Windows klasi.) a ne nekom objektu te klase.
    // Samim tim private konstruktor onemogucuje da pravimo objekta klase. Nadam se da ovo ima smisla.
    private Window()
    {
        
    }
    
    static void createWindow(int sirina, int visina, String naziv) // Zasto static? Zato sto imamo samo jedan prozor(window)! Takodje imamo tri parameta.
    {
        Display.setTitle(naziv); // U ovoj Display metodi postavljamo ime prozora.
        try
        {
            Display.setDisplayMode(new DisplayMode(sirina, visina)); // U ovoj metodi postavljamo prozor i njegove parametre. Takodje ova metoda zahteva try-catch blok.
            Display.create(); // U ovoj metodi pravimo prozor sa datim vec datim parametrima.
        }
        catch (LWJGLException e)
        {
            e.printStackTrace();
        }
    }
    
    static void destroyWindow()
    {
        Display.destroy();
    }
    
    static void render() // Pomovo zasto static? Zato sto imamo samo jedan prozor(window) samim tim potrebna nam je samo jedna render metoda. Nemamo parametre.
    {
        Display.update();
    }
    
    static boolean isCloseRequested() // Ista prica za static. Ovo je boolean koji vraca vrednost Display meotde koja se zove isCloseRequested().
    {
        return Display.isCloseRequested();
    }
    
    // Sada su na redu geteri. Nema potrebe za seterima.
    static int getWidth()
    {
        return Display.getWidth();
        //return Display.getDisplayMode().getWidth(); // Mozda je ovo pravilnije? 
    }
    static int getHeight()
    {
        return Display.getHeight();
        //return Display.getDisplayMode().getHeight(); // Mozda je ovo pravilnije?
    }
    static String getTitle()
    {
        return Display.getTitle();
    } 
}
